package com.sbc.web;


import com.sbc.convention.constants.CommonEnum;
import com.sbc.convention.errorcode.BaseErrorCodeEnum;
import com.sbc.convention.exception.AbstractException;
import com.sbc.convention.result.Result;

import java.util.Optional;

/**
 * @description: 请求返回包装类
 * @author: songbaicheng
 * @create: 2024-02-26 18:00
 **/
public class Results {

    /**
     * 构造成功响应
     *
     * @return 成功报文
     */
    public static Result<Void> success() {
        return new Result<Void>()
                .setCode(CommonEnum.SUCCESS.code())
                .setMessage(CommonEnum.SUCCESS.message());
    }

    /**
     * 构造带返回数据的成功响应
     *
     * @param data 成功报文数据
     * @return 成功报文
     */
    public static <T> Result<T> success(T data) {
        return new Result<T>()
                .setCode(CommonEnum.SUCCESS.code())
                .setMessage(CommonEnum.SUCCESS.message())
                .setData(data);
    }

    /**
     * 构建服务端失败响应
     *
     * @return 失败报文
     */
    public static Result<Void> failure() {
        return new Result<Void>()
                .setCode(BaseErrorCodeEnum.SERVICE_ERROR.code())
                .setMessage(BaseErrorCodeEnum.SERVICE_ERROR.message());
    }

    /**
     * 构造带返回数据的错误响应
     *
     * @param data 错误报文数据
     * @return 错误报文
     */
    public static <T> Result<T> failure(T data) {
        return new Result<T>()
                .setCode(CommonEnum.ERROR.code())
                .setMessage(CommonEnum.ERROR.message())
                .setData(data);
    }

    /**
     * 通过 {@link AbstractException} 构建失败响应
     */
    public static Result<Void> failure(AbstractException abstractException) {
        String errorCode = Optional.ofNullable(abstractException.getErrorCode())
                .orElse(BaseErrorCodeEnum.SERVICE_ERROR.code());
        String errorMessage = Optional.ofNullable(abstractException.getErrorMessage())
                .orElse(BaseErrorCodeEnum.SERVICE_ERROR.message());
        return new Result<Void>()
                .setCode(errorCode)
                .setMessage(errorMessage);
    }

    /**
     * 通过 errorCode、errorMessage 构建失败响应
     *
     * @param errorCode 错误码
     * @param errorMessage 错误信息
     * @return 失败报文
     */
    public static Result<Void> failure(String errorCode, String errorMessage) {
        return new Result<Void>()
                .setCode(errorCode)
                .setMessage(errorMessage);
    }
}
